参考知识点:01.2 精通自定义 View 之绘图基础——路径
从效果图中可以看出,我们要先画出一个网格,默认网格数和边角数都是 6。在代码中,为了简化逻辑,我们会将所有可变的内容,比如画笔颜色、网格数、边角数设为固定值。其实这些值都应该在初始化的时候通过对应的 set 函数设置到自定义控件内部,大家可以自行补充。
一、初始化
不要在 onDraw() 函数中创建变量,所以必然会有一个初始化函数,用于在创建控件的时候初始化画笔等参数。
这里初始化了三个画笔,其中 mRadarPaint 是用来绘制蜘蛛网格的,类型设置为填充 (也可以设置为描边);mRadarLinePaint 是用来绘制蜘蛛网格辐射的六根线,白色描边;而 mValuePaint 是用来绘制结果图的,所以设置成带透明的红色画笔,样式为填充。
二、获得布局中心
在 onSizeChanged(int w, int h, int oldW, int oldH) 函数中,根据 View 的长、宽,获取整个布局的中心坐标,因为整个雷达都是从这个中心坐标开始绘制的。
我们知道,在控件大小发生变化时,都会通过 onSizeChanged() 函数通知我们当前控件的大小。所以,我们只需要重写 onSizeChanged() 函数,即可得知当前控件的最新大小。
为了不顶边,将蜘蛛网的半径设置为 Math.min(w, h) / 2f * 0.8f 。
然后依据绘图中心,分别绘制蜘蛛网格、网格中线、数据图,即可完成整个效果图的绘制。
三、绘制蜘蛛网格
下面我们就要绘制蜘蛛网格了,效果如下图所示。
很显然,蜘蛛网格是利用 Path 的 moveTo() 和 lineTo() 函数一圈圈画出来的,我们需要计算出每个转折点的位置。比如,计算下图中所标记点的 x, y 坐标。
很明显,标记点在半径的 3/4 位置,而标记点与中心点的连线与 X 轴的夹角为 a,所以由图可得:
因为我们共画了 6 个角,所以每个角的度数应该是 360°/6 = 60°。
依据上面的原理,列出画蜘蛛网格的代码如下:
四、画网格中线
在画完蜘蛛网格以后,我们需要画从网格中心到末端的直线,代码如下:
绘制原理与绘制蜘蛛网格是一样的,先找到各个末端点的坐标,然后画一条从中心点到末端点的连线即可。
五、画数据图
绘制数据区域其实也很简单,首先要确定每个数据点的位置。当然,网格线中的每一层网格都应该对应一个数值,在这里为了方便起见,将网格的最大值设为 4,即每一层数值是按 1,2,3,4 分布的。
六、完整代码
|
|